package module;

import java.util.ArrayList;

import perso.Groupe;
import perso.MotorPersoImp;


import motor.ModuleMobile;
import motor.MotorPerso;
import motor.Unite;

import utils.Vector2d;


public class ModuleMobilePerso extends ModuleMobile
{
	int sizeColli = 3;
	
	int sizeStable = 10;
	
	int marge = 3;

	public ModuleMobilePerso( Unite mere)
	{
		super( mere );
	}
	
	public void movePerso(MotorPersoImp m , ArrayList<Groupe> voisinsG )
	{
		float xmarge = 0;
		float ymarge = 0;
		
		if( vtemp.x > 0 )
		{
			xmarge = marge;
		}
		else if( vtemp.x < 0 )
		{
			xmarge = -marge;
		}
		
		if( vtemp.y > 0 )
		{
			ymarge = marge;
		}
		else if( vtemp.y < 0 )
		{
			ymarge = -marge;
		}
		
		Vector2d newd = new Vector2d(getPos().x + vtemp.x + xmarge , getPos().y + vtemp.y + ymarge );
		
		Vector2d res = m.graphe.s.cansee( getPos(), newd);
		
		if( res != null )
		{
			if( res.x == 0 || res.x == m.graphe.s.wxsize )
			{
				vtemp.x = -vtemp.x;
			}
			
			if( res.y == 0 || res.y == m.graphe.s.wysize )
			{
				vtemp.y = - vtemp.y;
			}
		}
		
		Vector2d delta = collisionPerso( voisinsG );
		
		//System.out.println("Colli : " + delta );
		
		if( delta != null && res == null )
		{
			vtemp.x = delta.x;
			vtemp.y = delta.y;
		}
		
		//System.out.println(getPos());
	}

	private Vector2d collisionPerso(ArrayList<Groupe> voisinsG)
	{
		ArrayList<Unite> voisins = new ArrayList<Unite>();
		
		for( int i = 0 ; i < voisinsG.size() ; i++ )
		{
			for( int j = 0 ; j < voisinsG.get(i).interne.size() ; j++ )
			{
				float dis = mere.distance(voisinsG.get(i).interne.get(j).getPos() );
				
				if( dis < mere.getSize()/2 + voisinsG.get(i).interne.get(j).getSize()/2 + sizeColli && voisinsG.get(i).interne.get(j) != mere )
				{
					voisins.add(voisinsG.get(i).interne.get(j));
				}
			}
		}
		
		//System.out.println("nbV : " + voisins.size() );
		//System.out.println("V : " + voisins );
		
		if( voisins.size() >= 1 )
		{
			Vector2d moy = new Vector2d(0, 0);
			
			for( int i = 0 ; i < voisins.size() ; i++ )
			{
				moy.x += voisins.get(i).getPos().x;
				moy.y += voisins.get(i).getPos().y;
			}
			
			moy.x /= voisins.size();
			moy.y /= voisins.size();
			
			moy.x = -(moy.x - getPos().x);
			moy.y = -(moy.y - getPos().y);
			
			if( moy.x == 0 && moy.y ==  0 )
			{
				moy.x = (float) (Math.random()-0.5);
				moy.y = (float) (Math.random()-0.5);
			}
			
			//System.out.println("moy : " + moy );
			return moy;
		}
		
		return null;
	}
	

	public void calVemp(Vector2d bary)
	{
		vtemp.x = 0;
		vtemp.y = 0;
		
		if( mere.distance(bary) > sizeStable )
		{
			vtemp.x = - getPos().x + bary.x;
			vtemp.y = - getPos().y + bary.y;
		}
		
		float val = (float) Math.sqrt(Math.pow(vtemp.x, 2 ) + Math.pow(vtemp.y, 2 ));
		
		if( val != 0 )
		{
			vtemp.x *= getV()/val;
			vtemp.y *= getV()/val;
		}
	}
}
